Procedural outline

Turn on machines / heaters. Put mice in tailcuff room and let the room and mice acclimate to appropriate temperature for ~30-60 mins. Then, check cuffs for leaks. Put mice into restraints and perform 5 acclimation cycles + 20 recorded cycles.

When placing mice into restraints,
1. Quickly place nose cuff on to avoid letting them turn around in the restraint
2. Make sure that you can see them breathing…
3. Maximize tightness of fit and breathing

Metadata Analysis

This workbook is set up to analyze two groups of mice! Just run and enjoy (you’ll probably need to change out drug names…)

Metadata
group Specimen Name Mouse Unique ID Gender Notch DOB Wean Date CageID Current Age (weeks) Date ready for Telemetry implant New CageID Status Date of death Machine ID Average body weight (g)
vehicle M1 1A Male NN 2021-03-25 2021-04-20 662055 9.285714 2021-05-20 NA Alive NA 1 26.4
sorafenib M2 2A Male RN 2021-03-25 2021-04-20 662055 9.285714 2021-05-20 NA Alive NA 1 24.9
sorafenib M3 3A Male LN 2021-03-25 2021-04-20 662055 9.285714 2021-05-20 NA Alive NA 1 26.2
vehicle M4 4A Male BN 2021-03-25 2021-04-20 662055 9.285714 2021-05-20 NA Alive NA 1 25.7
vehicle M5 5A Male DR 2021-03-25 2021-04-20 662055 9.285714 2021-05-20 NA Alive NA 1 27.5
sorafenib M6 1B Male NN 2021-03-30 2021-04-13 662047 8.571429 2021-05-25 NA Alive NA 2 25.1
vehicle M7 2B Male RN 2021-03-30 2021-04-13 662047 8.571429 2021-05-25 NA Alive NA 2 25.7
vehicle M8 3B Male LN 2021-03-30 2021-04-13 662047 8.571429 2021-05-25 NA Alive NA 2 24.9
sorafenib M9 4B Male BN 2021-03-30 2021-04-13 662047 8.571429 2021-05-25 NA Alive NA 2 23.4
sorafenib M10 5B Male DR 2021-03-30 2021-04-13 662047 8.571429 2021-05-25 NA Alive NA 2 25.3

Inspect accepted cycles and changes in mouse body weight over time

Average animal body weight

Joining, by = “Specimen Name”

Animal body weight change over time

Joining, by = “Specimen Name”

Blood Pressure Data Analysis

Filtering out days that had less than ‘x’ cycles

Removed days/Specimens with less than 5 cycles:
Specimen Name Date group # cycles reason
M3 2021-05-25 sorafenib 1 Low cycle count
M7 2021-05-25 vehicle 4 Low cycle count

Removing outliers

Detect outliers BP measurements using boxplot methods. Boxplots are a popular and an easy method for identifying outliers. There are two categories of outlier: (1) outliers and (2) extreme points. Values above Q3 + 2xIQR or below Q1 - 2xIQR are considered as outliers. Q1 and Q3 are the first and third quartile, respectively. IQR is the interquartile range (IQR = Q3 - Q1). This method is more robust than STDEV based outlier detection because outliers can skew the mean and STDEV of a sample.

Here, outliers are nominated based on daily blood pressure recordings, so as to not throw out data on treatment days when the blood pressure is expected to rise above the average.

Additionally, we remove mice that are too ‘volatile’ after trianing period has finished.

Plot the data over time and visualize the variance per day, per sample with boxplots, over all days

Pilot 2 | sorafenib 100 mg/kg/d

Dates
Phase first last date_range Number of Days
training 2021-05-25 2021-05-28 2021-05-25 to 2021-05-28 4
vehicle 2021-05-29 2021-05-29 2021-05-29 to 2021-05-29 1

Assess BP of randomly assigned groups before getting treatment

3-day rolling average

Take the last 3-days of an interval and average them for more realistic averages

summarise() has grouped output by ‘Specimen Name’, ‘group’. You can override using the .groups argument. summarise() has grouped output by ‘group’. You can override using the .groups argument.

Time-series data

For completeness, here is the time series data of each mouse across each Phase of the experiment:

Time-series diff by individual mouse from vehicle average to end of treatment

Time-series diff by group

These are the average blood pressures of each mice across each Phase of the experiment

Booklet usage instructions

Download excel data after finishing the experiments onto thumb drive

Copy the data into a master excel file with two sheets, making sure that there’s only one header (at the very top of the page).

  1. You’ll need to add in two columns manually to this master sheet: Date and Phase. Phase can take one of 4 values: “training”, “baseline”, “vehicle”, “treatment”. Training data ultimately gets removed, but included in the data sheet for completeness. First sheet should look like this:
  1. Second sheet should be created manually based on your mice. Fill in the various fields.
LS0tCnRpdGxlOiBQaWxvdGluZyB0aGUgYWRtaW5pc3RyYXRpb24gb2YgU29yYWZlbmliIDEwMCBtZy9rZy9kIHZpYSBvcmFsIGdhdmFnZSBhbmQgbWVhc3VyaW5nCiAgYmxvb2QgcHJlc3N1cmUgYnkgdGhlIHRhaWwtY3VmZiBtZXRob2QKYXV0aG9yOiAiTmljayBDYW1hcmRhIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyMgUHJvY2VkdXJhbCBvdXRsaW5lClR1cm4gb24gbWFjaGluZXMgLyBoZWF0ZXJzLiBQdXQgbWljZSBpbiB0YWlsY3VmZiByb29tIGFuZCBsZXQgdGhlIHJvb20gYW5kIG1pY2UgYWNjbGltYXRlIHRvIGFwcHJvcHJpYXRlIHRlbXBlcmF0dXJlIGZvciB+MzAtNjAgbWlucy4gVGhlbiwgY2hlY2sgY3VmZnMgZm9yIGxlYWtzLiBQdXQgbWljZSBpbnRvIHJlc3RyYWludHMgYW5kIHBlcmZvcm0gNSBhY2NsaW1hdGlvbiBjeWNsZXMgKyAyMCByZWNvcmRlZCBjeWNsZXMuIAoKV2hlbiBwbGFjaW5nIG1pY2UgaW50byByZXN0cmFpbnRzLCAgCiAgMS4gUXVpY2tseSBwbGFjZSBub3NlIGN1ZmYgb24gdG8gYXZvaWQgbGV0dGluZyB0aGVtIHR1cm4gYXJvdW5kIGluIHRoZSByZXN0cmFpbnRcCiAgMi4gTWFrZSBzdXJlIHRoYXQgeW91IGNhbiBzZWUgdGhlbSBicmVhdGhpbmcuLi4gIAogIDMuIE1heGltaXplIHRpZ2h0bmVzcyBvZiBmaXQgYW5kIGJyZWF0aGluZwoKYGBge3IgcmVhZF9kYXRhLCAgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJzdGF0aXgpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoZ2dmb3JjZSkKIyBsaWJyYXJ5KGdnc3RhdHNwbG90KQojIGxpYnJhcnkoZ2FwbWluZGVyKQpsaWJyYXJ5KGdnc2NpKQpsaWJyYXJ5KGdncHVicikKbGlicmFyeShyc3RhdGl4KSAjIGlkZW50aWZ5X291dGxpZXJzCgpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShmb3JjYXRzKQoKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoR2V0b3B0TG9uZykKCiMgbGlicmFyeShleHBlcmltZW50KQpsaWJyYXJ5KHJhbmRvbWl6cikKCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAiYXNpcyIsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gOCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5wYXRoID0gIlJFQURNRV9maWdzL1JFQURNRS0iKQoKZmN0X3BoYXNlcyA8LSBjKCJ0cmFpbmluZyIsICJiYXNlbGluZSIsICJ2ZWhpY2xlIiwgInRyZWF0bWVudCIsICJ0cmVhdG1lbnQgMngiKQp0eF9waGFzZXMgPC0gYygidHJlYXRtZW50IiwgInRyZWF0bWVudCAyeCIpCgoKCm15X3RoZW1lIDwtIHRoZW1lX3N0YXRhKCkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyMCksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIsIGNvbG9yID0gImJsYWNrIiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpKSAKCgoKIyBhdHRhY2ggdGh1bWJkcml2ZSBmaXJzdAojIGRhdGFfZGlyIDwtICIvVm9sdW1lcy9OREMyMDIxL3RhaWxjdWZmIgojIHByb2plY3RfZGlyIDwtICJzb3ItcGlsb3QyIgojIAojIHJhd19kYXRhX2Rpcl9mdWxsIDwtIGZpbGUucGF0aChkYXRhX2RpciwgcHJvamVjdF9kaXIpCiMgcmF3X2RhdGFfdGJsIDwtIHRpYmJsZShmbiA9IGxpc3QuZmlsZXMocmF3X2RhdGFfZGlyX2Z1bGwsIGZ1bGwubmFtZXMgPSBUUlVFKSkgJT4lCiMgICBtdXRhdGUoRGF0ZSA9IHN0cl9zcGxpdChzdHJpbmcgPSBmbiwgcGF0dGVybiA9ICItYV98LWJffFxcLiIsIHNpbXBsaWZ5ID0gVFJVRSlbLDJdKSAlPiUgCiMgICB1bm5lc3QoKSAlPiUKIyAgIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCAiJW1fJWRfJVkiKSkgJT4lCiMgICBtdXRhdGUoZGF0ID0gbWFwKGZuLCByZWFkX2NzdikpICU+JQojICAgdW5uZXN0KCkgJT4lCiMgICBzZWxlY3QoLWZuKSAlPiUKIyAgIHJlbG9jYXRlKERhdGUsIC5hZnRlciA9IGxhc3RfY29sKCkpICU+JQojICAgbXV0YXRlKFBoYXNlID0gInRyYWluaW5nIikgJT4lCiMgICBhcnJhbmdlKERhdGUpCiMgCiMgCiMgd3JpdGVfY3N2KHJhd19kYXRhX3RibCwgIn4vRG93bmxvYWRzL3RlbXAuY3N2IikKCiMnIHJlYWRzIGluIG1lZ2EgZXhjZWwgZmlsZSAKZGF0YV9kaXIgPC0gIi9Vc2Vycy9uY2FtYXJkYS9PbmVEcml2ZSAtIFR1ZnRzL3BoZC9wcm9qZWN0cy92ZWdmcmkvc29yYWZlbmliL21vdXNlLXN0dWRpZXMvdGFpbC1jdWZmIgpmbl9uYW1lIDwtICJQaWxvdCAyIC0gc29yYWZlbmliIG9yYWwgZ2F2YWdlIC0gZG9zYWdlIDEwMCBtZ2tnZCAtIE1BU1RFUi54bHN4IgpmdWxsX3BhdGhfZm4gPC0gZmlsZS5wYXRoKGRhdGFfZGlyLCBmbl9uYW1lKQoKc3BsaXRfZm5fbmFtZSA8LSBzdHJfc3BsaXQoc3RyaW5nID0gZm5fbmFtZSwgcGF0dGVybiA9ICIgLSAiLCBzaW1wbGlmeSA9IFRSVUUpCnRyaWFsX25hbWUgPC0gc3BsaXRfZm5fbmFtZVssMV0KZHJ1Z19uYW1lIDwtIHN0cl9zcGxpdChzdHJpbmcgPSBzcGxpdF9mbl9uYW1lWywyXSwgcGF0dGVybiA9ICIgIiwgc2ltcGxpZnkgPSBUUlVFKVssMV0KZHJ1Z19kb3NhZ2UgPC0gc3RyX3NwbGl0KHN0cmluZyA9IHNwbGl0X2ZuX25hbWVbLDNdLCBwYXR0ZXJuID0gIiAiLCBzaW1wbGlmeSA9IFRSVUUpWywyXQoKCiMgRXh0cmFjdCB0aGUgdHJpYWwgbnVtIGZyb20gZm5fbmFtZSwgbnVtYmVyIG5leHQgdG8gInBpbG90Igp0cmlhbF9udW0gPC0gc3RyX3NwbGl0KHN0cmluZyA9IGZuX25hbWUsIHBhdHRlcm4gPSAiICIsIHNpbXBsaWZ5ID0gVClbLDJdCgojJyBvdGhlciByZW1vdmVkIGZuIGRlbm90ZXMgb3RoZXIgcmVhc29ucyB3aHkgeW91IG1pZ2h0IG5vdCB3YW50IHRvIGluY2x1ZGUgYSBtb3VzZSdzIGRhdGEgZm9yIGEgc3BlY2lmaWMgZGF5Cm90aGVyX3JlbW92ZWRfZm4gPC0gcXEoIi4vb3RoZXJfcmVtb3ZlZC1Ae2RydWdfbmFtZX0tQHt0cmlhbF9udW19LmNzdiIpCmlmICghZmlsZS5leGlzdHMob3RoZXJfcmVtb3ZlZF9mbikpIHsKICBmaWxlLmNyZWF0ZShvdGhlcl9yZW1vdmVkX2ZuLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKfQoKc2hhcGVfaWRfZGYgPC0gdGliYmxlKGBTcGVjaW1lbiBOYW1lYCA9IHN0cl9jKCJNIixzZXEoMSwgMTAsIDEpKSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwZV9pZCA9IGMoMDo2LDEwOjEyKSkgIyBjKDA6NiwxMCkgCgojIyBSZWFkIGluIHRoZSBkYXRhCmRhdGFfdGVtcCA8LSByZWFkX2V4Y2VsKGZ1bGxfcGF0aF9mbiwgc2hlZXQgPSAxKSAlPiUgCiAgZHBseXI6OnNlbGVjdChgU3BlY2ltZW4gTmFtZWAsIFN5c3RvbGljLCBNZWFuLCBSYXRlLCBgQ3ljbGUgI2AsIGBEYXRlYCwgUGhhc2UpICU+JQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlLCAiR01UIikpICU+JQogIGFycmFuZ2UoRGF0ZSwgYFNwZWNpbWVuIE5hbWVgLCBgQ3ljbGUgI2ApICU+JQogIG11dGF0ZShgU3BlY2ltZW4gTmFtZWAgPSBmYWN0b3IoYFNwZWNpbWVuIE5hbWVgLCBsZXZlbHMgPSBzdHJfYygiTSIsIHNlcSgxLCAxMCwgMSkpKSkgJT4lCiAgIyBmaWx0ZXIoUGhhc2UgIT0gInRyYWluaW5nIiwgUGhhc2UgIT0gInR4MSIpICU+JQogIG11dGF0ZShQaGFzZSA9IGZhY3RvcihQaGFzZSwgbGV2ZWxzID0gZmN0X3BoYXNlcykpICU+JQogIGFycmFuZ2UoUGhhc2UsIGBTcGVjaW1lbiBOYW1lYCkgCgptZXRhX2RmX2FsbF90ZW1wIDwtIHJlYWRfZXhjZWwoZnVsbF9wYXRoX2ZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAyKSAlPiUKICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgIkdNVCIpLAogICAgICAgICBET0IgPSBhcy5EYXRlKERPQiwgIkdNVCIpKSAlPiUKICBhcnJhbmdlKERhdGUsIGBTcGVjaW1lbiBOYW1lYCkgJT4lCiAgbXV0YXRlKGBTcGVjaW1lbiBOYW1lYCA9IGZhY3RvcihgU3BlY2ltZW4gTmFtZWAsIGxldmVscyA9IHN0cl9jKCJNIiwgc2VxKDEsIDEwLCAxKSkpLAogICAgICAgICBgRGF0ZWAgPSBhcy5mYWN0b3IoRGF0ZSksCiAgICAgICAgIGBCb2R5IHdlaWdodCAoZylgID0gYXMubnVtZXJpYyhgQm9keSB3ZWlnaHQgKGcpYCkpICU+JQogIGdyb3VwX2J5KGBTcGVjaW1lbiBOYW1lYCkKCgpkZWFkX21pY2UgPC0gbWV0YV9kZl9hbGxfdGVtcCAlPiUgCiAgZGlzdGluY3QoYFNwZWNpbWVuIE5hbWVgLCBgRGF0ZSBvZiBkZWF0aGApICU+JQogIG5hLm9taXQoKSAKCgojIG1ldGFfZGZfYWxsX3RlbXBfY29weSA8LSBhcHBseShkZWFkX21pY2UsIDEsIGZ1bmN0aW9uKHIpIHsKIyAgICMgciA8LSBkZWFkX21pY2VbMixdCiMgICBzbiA8LSBhcy5jaGFyYWN0ZXIoZ2V0RWxlbWVudChyLCAiU3BlY2ltZW4gTmFtZSIpKQojICAgZG9kIDwtIGFzLkRhdGUoZ2V0RWxlbWVudChyLCAiRGF0ZSBvZiBkZWF0aCIpKQojIAojICAgbG9vcCA8LSBhcHBseShYID0gbWV0YV9kZl9hbGxfdGVtcCwgTUFSR0lOID0gMSwgRlVOID0gZnVuY3Rpb24ocnIpIHsKIyAgICAgIyByciA8LSBtZXRhX2RmX2FsbF90ZW1wWzEsXQojICAgICBmc24gPC0gYXMuY2hhcmFjdGVyKGdldEVsZW1lbnQocnIsICJTcGVjaW1lbiBOYW1lIikpCiMgICAgIGZkIDwtIGFzLkRhdGUoZ2V0RWxlbWVudChyciwgIkRhdGUiKSkKIyAKIyAgICAgaWYgKGZzbiA9PSBzbiAmIGRvZCA8IGZkKSByZW1vdmUgPC0gVFJVRQojICAgICBlbHNlIHJlbW92ZSA8LSBGQUxTRQojICAgICByZXR1cm4ocmVtb3ZlKQojICAgfSkKIyAgIHJldHVybihtZXRhX2RmX2FsbF90ZW1wWyFsb29wLF0pCiMgfSkKCm1ldGFfZGZfdGVtcCA8LSBtZXRhX2RmX2FsbF90ZW1wICU+JSAKICBzdW1tYXJpemUoYEF2ZXJhZ2UgYm9keSB3ZWlnaHQgKGcpYCA9IG1lYW4oYEJvZHkgd2VpZ2h0IChnKWAsIG5hLnJtID0gVCksIC5ncm91cHMgPSAia2VlcCIpIAoKCm1ldGFfZGZfYWxsIDwtIG1ldGFfZGZfYWxsX3RlbXAKbWV0YV9kZiA8LSBpbm5lcl9qb2luKG1ldGFfZGZfYWxsICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgZHBseXI6OnNlbGVjdCgtYEJvZHkgd2VpZ2h0IChnKWAsIC1gRGF0ZWApICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSwgCiAgICAgICAgICAgICAgICAgICAgICBtZXRhX2RmX3RlbXApICU+JQogIGFycmFuZ2UoYFNwZWNpbWVuIE5hbWVgKSAlPiUKICBhbnRpX2pvaW4oZGVhZF9taWNlICU+JSBkaXN0aW5jdChgU3BlY2ltZW4gTmFtZWApKQoKIyBibG9jayByYW5kb20gYXNzaWdubWVudCBieSBtYWNoaW5lCgpzZXQuc2VlZCgyMjIyKQpudW1fbWljZSA8LSBucm93KG1ldGFfZGYpOwojIGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9yYW5kb21penIvdmlnbmV0dGVzL3JhbmRvbWl6cl92aWduZXR0ZS5odG1sCgoKbWV0YV9kZl93X2Fzc2lnbiA8LSBtZXRhX2RmICU+JSAKICBiaW5kX2NvbHModGliYmxlKGdyb3VwID0gY29tcGxldGVfcmEoTiA9IG51bV9taWNlLCBwcm9iID0gMC41KSkpICU+JQogIG11dGF0ZShncm91cCA9IGlmZWxzZShncm91cCA9PSAwLCAidmVoaWNsZSIsIGRydWdfbmFtZSkpICU+JQogIG11dGF0ZShncm91cCA9IGZhY3Rvcihncm91cCwgbGV2ZWxzID0gYyhkcnVnX25hbWUsICJ2ZWhpY2xlIikpKSAlPiUKICBhcnJhbmdlKGBTcGVjaW1lbiBOYW1lYCwgZ3JvdXApICU+JQogIGRwbHlyOjpzZWxlY3QoZ3JvdXAsIGV2ZXJ5dGhpbmcoKSkKCm51bV9taWNlX3Blcl9ncm91cCA8LSBtZXRhX2RmX3dfYXNzaWduICU+JSAKICBncm91cF9ieShncm91cCkgJT4lCiAgc3VtbWFyaXplKG4gPSBuKCkpCgpudW1fbWljZV9wZXJfZ3JvdXBfc3RyIDwtIG51bV9taWNlX3Blcl9ncm91cCAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXApICU+JQogIG11dGF0ZShuX3N0ciA9IG1hcDJfY2hyKGdyb3VwLCBuLCBmdW5jdGlvbihhLGIpIHFxKCJOIEB7Z3JvdXB9ID0gQHtufSIpKSkgJT4lCiAgcGx1Y2soIm5fc3RyIikgJT4lIAogIHN0cl9jKGNvbGxhcHNlID0gIiB8ICIpCgoKIyBtZXJnZSBkYXRhIGFuZCBtZXRhCmRhdGEgPC0gZGF0YV90ZW1wICU+JSAKICByaWdodF9qb2luKG1ldGFfZGZfd19hc3NpZ24pICU+JSAjIGlubmVyIGpvaW4/IHJpZ2h0IGpvaW4/CiAgcmlnaHRfam9pbihzaGFwZV9pZF9kZikgJT4lCiAgbXV0YXRlKGNvbG9yID0gaWZlbHNlKGdyb3VwID09ICJ2ZWhpY2xlIiwgIiMxZTgxYjAiLCAiI2VkOTk0MiIpKSAlPiUKICBtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIiNlZDk5NDIiLCAiIzFlODFiMCIpKSkgJT4lCiAgbXV0YXRlKGBTcGVjaW1lbiBOYW1lYCA9IGZhY3RvcihgU3BlY2ltZW4gTmFtZWAsIGxldmVscyA9IHVuaXF1ZSguJGBTcGVjaW1lbiBOYW1lYCkpKSAKIyAlPiUKIyAgIGZpbHRlcihgU3BlY2ltZW4gTmFtZWAgIT0gIk0yIikKCiMgcmFuZF9kYXQgPC0gcmFuZG9taXplKGRhdGEsIG1hdGNoID0gIlN5c3RvbGljIikKCnNoYXBlX2lkcyA8LSB1bmlxdWUoZGF0YSRzaGFwZV9pZCkKCnN1bl9jb2xvciA8LSB3aGljaChtZXRhX2RmX3dfYXNzaWduJGdyb3VwID09IGRydWdfbmFtZSkKdmVoX2NvbG9yIDwtIHdoaWNoKG1ldGFfZGZfd19hc3NpZ24kZ3JvdXAgPT0gInZlaGljbGUiKQpgYGAKCiMjIE1ldGFkYXRhIEFuYWx5c2lzClRoaXMgd29ya2Jvb2sgaXMgc2V0IHVwIHRvIGFuYWx5emUgdHdvIGdyb3VwcyBvZiBtaWNlISBKdXN0IHJ1biBhbmQgZW5qb3kgKHlvdSdsbCBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZSBvdXQgZHJ1ZyBuYW1lcy4uLikKCmBgYHtyIHBsb3RfbWV0YSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprYWJsZShtZXRhX2RmX3dfYXNzaWduLCBjYXB0aW9uID0gIk1ldGFkYXRhIiwgYWxpZ24gPSAiYyIpICU+JQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiKSAlPiUKICByb3dfc3BlYyhzdW5fY29sb3IsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI2VkOTk0MiIpICU+JQogIHJvd19zcGVjKHZlaF9jb2xvciwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjMWU4MWIwIikKCgojIHRhYmxlKHR4ID0gbWV0YV9kZl93X2Fzc2lnbiRncm91cCwgbWFjaGluZSA9IG1ldGFfZGZfd19hc3NpZ24kYE1hY2hpbmUgSURgCgpgYGAKCgojIyBJbnNwZWN0IGFjY2VwdGVkIGN5Y2xlcyBhbmQgY2hhbmdlcyBpbiBtb3VzZSBib2R5IHdlaWdodCBvdmVyIHRpbWUKYGBge3IgYWNjZXB0ZWRfY3ljbGVzLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9OH0KcmVtb3ZlX2JhZF9kYXlzX2RmMSA8LSBkYXRhICU+JQogIGdyb3VwX2J5KGBTcGVjaW1lbiBOYW1lYCwgRGF0ZSwgZ3JvdXAsIGNvbG9yKSAlPiUKICBzdW1tYXJpemUobiA9IG4oKSkgJT4lCiAgYXJyYW5nZShEYXRlLCBgU3BlY2ltZW4gTmFtZWApIAoKaWYgKG5yb3cocmVtb3ZlX2JhZF9kYXlzX2RmMSkgIT0gMCl7CiAgZzEgPC0gZ2dwbG90KHJlbW92ZV9iYWRfZGF5c19kZjEsIGFlcyhjb2xvciA9IGBncm91cGAsIHggPSBEYXRlLCB5ID0gbikpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRikgKyAKICBnZW9tX2xpbmUoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImN5YW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgIyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiZ3JvdXAiLCB2YWx1ZXMgPSBsZXZlbHMocmVtb3ZlX2JhZF9kYXlzX2RmMSRjb2xvcikpICsKICBzY2FsZV94X2RhdGUoYnJlYWtzID0gdW5pcXVlKHJlbW92ZV9iYWRfZGF5c19kZjEkRGF0ZSkpICsgCiAgbXlfdGhlbWUgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsMzUsNSkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdD0xLCBzaXplID0gNSkpICsKICB5bGFiKCJOdW1iZXIgb2YgQWNjZXB0ZWQgQ3ljbGVzIikgKwogIGdndGl0bGUoIkFjY2VwdGVkIGN5Y2xlcyBwZXIgbW91c2Ugb3ZlciB0aW1lIikgKyAKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGBTcGVjaW1lbiBOYW1lYCkpCmcxCn0KCgpgYGAKCiMjIyBBdmVyYWdlIGFuaW1hbCBib2R5IHdlaWdodApgYGB7ciBhdmdfYm9keXdlaWdodCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9OH0KCm1ldGFfZGZfd2VpZ2h0IDwtIGxlZnRfam9pbihtZXRhX2RmX2FsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2RmX3dfYXNzaWduICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoYFNwZWNpbWVuIE5hbWVgLCBncm91cCkpICU+JQogIGZpbHRlcihTdGF0dXMgPT0gIkFsaXZlIikKZzIgPC0gZ2dwbG90KG1ldGFfZGZfd2VpZ2h0LCBhZXMoZmlsbCA9IGBncm91cGAsIHggPSBgU3BlY2ltZW4gTmFtZWAsIHkgPSBgQm9keSB3ZWlnaHQgKGcpYCkpICsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYT0wLjgpICsKICBzdGF0X3N1bW1hcnkoZnVuPSJtZWFuIiwgY29sb3IgPSAiY3lhbiIsIHNob3cubGVnZW5kID0gRikgKyAjIHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdCA9ICJpZGVudGl0eSIKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gImdyb3VwIiwgdmFsdWVzID0gbGV2ZWxzKHJlbW92ZV9iYWRfZGF5c19kZjEkY29sb3IpKSArCiAgbXlfdGhlbWUgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDIwLDMwLDIpKSArCiAgeWxhYigiQm9keSB3ZWlnaHQgKGcpIikgKwogIGdndGl0bGUoIkF2ZXJhZ2UgYW5pbWFsIGJvZHkgd2VpZ2h0IChnKSIpICsgCiAgZ2VvbV90ZXh0KGRhdGEgPSBtZXRhX2RmX3dfYXNzaWduLCAKICAgIGFlcyh4ID0gYFNwZWNpbWVuIE5hbWVgLCB5ID0gYEF2ZXJhZ2UgYm9keSB3ZWlnaHQgKGcpYCwgCiAgICAgICAgbGFiZWwgPSByb3VuZChgQXZlcmFnZSBib2R5IHdlaWdodCAoZylgLDEpLCB2anVzdCA9IDIuNSksIAogICAgaGp1c3QgPSAwLjUsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDUsIAogICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgCmcyCgpkYXRlcyA8LSB1bmlxdWUobWV0YV9kZl9hbGwkRGF0ZSkKcmVwcyA8LSBsZW5ndGgodW5pcXVlKG1ldGFfZGZfYWxsJGBTcGVjaW1lbiBOYW1lYCkpCmRhdGVfdGJsIDwtIHRpYmJsZShEYXRlID0gcmVwKGRhdGVzLCByZXBzKSkKYGBgCgojIyMgQW5pbWFsIGJvZHkgd2VpZ2h0IGNoYW5nZSBvdmVyIHRpbWUKYGBge3Igd2VpZ2h0X2NoYW5nZSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGggPSAxMn0gICAgICAgCndlaWdodF9jaGFuZ2VfZGYgPC0gbWV0YV9kZl9hbGwgJT4lCiAgYXJyYW5nZShEYXRlKSAlPiUKICBncm91cF9ieShgU3BlY2ltZW4gTmFtZWApICU+JSAKICBzdW1tYXJpemUoYFdlaWdodCBjaGFuZ2UgKGcpYCA9IGBCb2R5IHdlaWdodCAoZylgIC0gYEJvZHkgd2VpZ2h0IChnKWBbMUxdKSAlPiUKICBiaW5kX2NvbHMoZGF0ZV90YmwpICU+JQogIG11dGF0ZShEYXRlID0gYXMuRGF0ZShEYXRlKSkgJT4lCiAgbGVmdF9qb2luKGRhdGEgJT4lIGRpc3RpbmN0KGBTcGVjaW1lbiBOYW1lYCwgZ3JvdXApKQoKbWluX3dlaWdodF9jaGcgPC0gd2VpZ2h0X2NoYW5nZV9kZiAlPiUgbmEub21pdCgpICU+JSAuJGBXZWlnaHQgY2hhbmdlIChnKWAgJT4lIG1pbigpCm1heF93ZWlnaHRfY2hnIDwtIHdlaWdodF9jaGFuZ2VfZGYgJT4lIG5hLm9taXQoKSAlPiUgLiRgV2VpZ2h0IGNoYW5nZSAoZylgICU+JSBtYXgoKQpnZ3Bsb3Qod2VpZ2h0X2NoYW5nZV9kZiAlPiUgbmEub21pdCgpLCBhZXMoeCA9IGBEYXRlYCwgeSA9IGBXZWlnaHQgY2hhbmdlIChnKWAsIGNvbG9yID0gYGdyb3VwYCkpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRikgKyAKICBnZW9tX2xpbmUoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImN5YW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiZ3JvdXAiLCB2YWx1ZXMgPSBsZXZlbHMocmVtb3ZlX2JhZF9kYXlzX2RmMSRjb2xvcikpICsgCiAgbXlfdGhlbWUgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiV2VpZ2h0IGNoYW5nZSAoZykiLCApICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcShtaW5fd2VpZ2h0X2NoZywgbWF4X3dlaWdodF9jaGcpKSArCiAgc2NhbGVfeF9kYXRlKGJyZWFrcyA9IHVuaXF1ZSh3ZWlnaHRfY2hhbmdlX2RmJERhdGUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3NSwgc2l6ZSA9IDYsIHZqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNTUpLAogICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKSArCiAgICBsYWJzKHRpdGxlID0gIldlaWdodCBjaGFuZ2UgKGcpIHNpbmNlIGJlZ2lubmluZyBvZiBleHBlcmltZW50XG4iKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhgU3BlY2ltZW4gTmFtZWApKQpgYGAKCmBgYHtyIGNoYW5nZV93ZWlnaHRfYXZnfQojIGRhaWx5IGF2ZXJhZ2Ugd2VpZ2h0IGxvc3MKZGFpbHlfbG9zdF93ZWlnaHRfYXZnX2RmIDwtIHdlaWdodF9jaGFuZ2VfZGYgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lCiAgc3VtbWFyaXplKHdlaWdodF9sb3NzX2F2ZyA9IG1lYW4oYFdlaWdodCBjaGFuZ2UgKGcpYCkpCgpmaW5hbF9hdmdfd2VpZ2h0IDwtIGRhaWx5X2xvc3Rfd2VpZ2h0X2F2Z19kZiAlPiUgc2xpY2UobigpKSAKICAKZ2dwbG90KGRhaWx5X2xvc3Rfd2VpZ2h0X2F2Z19kZiwgYWVzKHggPSBgRGF0ZWAsIHkgPSBgd2VpZ2h0X2xvc3NfYXZnYCkpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRikgKyAKICBnZW9tX2xpbmUoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBteV90aGVtZSArCiAgZ2VvbV9sYWJlbChkYXRhID0gZmluYWxfYXZnX3dlaWdodCwgCiAgICAgICAgICAgICBsYWJlbCA9IHJvdW5kKGZpbmFsX2F2Z193ZWlnaHQkd2VpZ2h0X2xvc3NfYXZnLCAyKSwgCiAgICAgICAgICAgICB2anVzdCA9IDEuNSwgY29sb3IgPSAicmVkIikgKwogIHlsYWIoIkF2ZXJhZ2UgZGFpbHkgd2VpZ2h0IGNoYW5nZSAoZykiKSArIAogICMgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsMTAsLjIpKSArCiAgc2NhbGVfeF9kYXRlKGJyZWFrcyA9IHVuaXF1ZSh3ZWlnaHRfY2hhbmdlX2RmJERhdGUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3NSwgc2l6ZSA9IDgsIHZqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNTUpLAogICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDIsICJsaW5lcyIpKSArCiAgICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2Ugd2VpZ2h0IGNoYW5nZSAoZykgYWNyb3NzIGFsbCBtaWNlXG5zaW5jZSBiZWdpbm5pbmcgb2YgZXhwZXJpbWVudFxuIikgIApgYGAKCiMjIEJsb29kIFByZXNzdXJlIERhdGEgQW5hbHlzaXMKIyMjIEZpbHRlcmluZyBvdXQgZGF5cyB0aGF0IGhhZCBsZXNzIHRoYW4gJ3gnIGN5Y2xlcwpgYGB7ciBiYWRfZGF5czEsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KRklMVEVSX09VVF9MRVNTX1RIQU5fQ1lDTEVTIDwtIDUKcmVtb3ZlZF9kZl90ZW1wIDwtIGlubmVyX2pvaW4ocmVtb3ZlX2JhZF9kYXlzX2RmMSAlPiUgZmlsdGVyKG4gPCBGSUxURVJfT1VUX0xFU1NfVEhBTl9DWUNMRVMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9iYWRfZGF5c19kZjEpICU+JQogIGRwbHlyOjpzZWxlY3QoLWNvbG9yKSAlPiUKICBtdXRhdGUocmVhc29uID0gIkxvdyBjeWNsZSBjb3VudCIpCgpvdGhlcl9kZiA8LSByZWFkX2NzdihvdGhlcl9yZW1vdmVkX2ZuKQpyZW1vdmVkX2RmIDwtIGJpbmRfcm93cyhyZW1vdmVkX2RmX3RlbXAsIG90aGVyX2RmKSAlPiUgYXJyYW5nZShEYXRlKQoKIyBwcmludCgiUmVtb3ZlZCBkYXlzL1NwZWNpbWVuczoiKQprYWJsZShyZW1vdmVkX2RmICU+JSByZW5hbWUoYCMgY3ljbGVzYCA9IG4pLAogICAgICBjYXB0aW9uID0gcXEoIlJlbW92ZWQgZGF5cy9TcGVjaW1lbnMgd2l0aCBsZXNzIHRoYW4gQHtGSUxURVJfT1VUX0xFU1NfVEhBTl9DWUNMRVN9IGN5Y2xlczoiKSkgJT4lCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIpCiAKIyBmaWx0ZXJlZCBkZgpiYWRfZGF5c19yZW1vdmVkX2RmIDwtIGFudGlfam9pbihkYXRhLCByZW1vdmVkX2RmKSAKCmBgYAoKIyMjIFJlbW92aW5nIG91dGxpZXJzCkRldGVjdCBvdXRsaWVycyBCUCBtZWFzdXJlbWVudHMgdXNpbmcgYm94cGxvdCBtZXRob2RzLiBCb3hwbG90cyBhcmUgYSBwb3B1bGFyIGFuZCBhbiBlYXN5IG1ldGhvZCBmb3IgaWRlbnRpZnlpbmcgb3V0bGllcnMuIFRoZXJlIGFyZSB0d28gY2F0ZWdvcmllcyBvZiBvdXRsaWVyOiAoMSkgb3V0bGllcnMgYW5kICgyKSBleHRyZW1lIHBvaW50cy4gVmFsdWVzIGFib3ZlIFEzICsgMnhJUVIgb3IgYmVsb3cgUTEgLSAyeElRUiBhcmUgY29uc2lkZXJlZCBhcyBvdXRsaWVycy4gUTEgYW5kIFEzIGFyZSB0aGUgZmlyc3QgYW5kIHRoaXJkIHF1YXJ0aWxlLCByZXNwZWN0aXZlbHkuIElRUiBpcyB0aGUgaW50ZXJxdWFydGlsZSByYW5nZSAoSVFSID0gUTMgLSBRMSkuIFRoaXMgbWV0aG9kIGlzIG1vcmUgcm9idXN0IHRoYW4gU1RERVYgYmFzZWQgb3V0bGllciBkZXRlY3Rpb24gYmVjYXVzZSBvdXRsaWVycyBjYW4gc2tldyB0aGUgbWVhbiBhbmQgU1RERVYgb2YgYSBzYW1wbGUuIAoKSGVyZSwgb3V0bGllcnMgYXJlIG5vbWluYXRlZCBiYXNlZCBvbiAqZGFpbHkqIGJsb29kIHByZXNzdXJlIHJlY29yZGluZ3MsIHNvIGFzIHRvIG5vdCB0aHJvdyBvdXQgZGF0YSBvbiB0cmVhdG1lbnQgZGF5cyB3aGVuIHRoZSBibG9vZCBwcmVzc3VyZSBpcyBleHBlY3RlZCB0byByaXNlIGFib3ZlIHRoZSBhdmVyYWdlLiAKCkFkZGl0aW9uYWxseSwgd2UgcmVtb3ZlIG1pY2UgdGhhdCBhcmUgdG9vICd2b2xhdGlsZScgYWZ0ZXIgdHJpYW5pbmcgcGVyaW9kIGhhcyBmaW5pc2hlZC4KCmBgYHtyIG91dGxpZXJzLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmZW5jZXNfZGYgPC0gYmFkX2RheXNfcmVtb3ZlZF9kZiAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZHBseXI6OnNlbGVjdChgU3BlY2ltZW4gTmFtZWAsIERhdGUsIGBDeWNsZSAjYCwgU3lzdG9saWMpICU+JQogIGRwbHlyOjpncm91cF9ieShgU3BlY2ltZW4gTmFtZWAsIGBEYXRlYCkgJT4lCiAgZHBseXI6OnN1bW1hcml6ZShtZWRpYW4gPSBtZWRpYW4oU3lzdG9saWMpLAogICAgICAgICAgICAgICAgICAgaXFyID0gSVFSKFN5c3RvbGljKSwKICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihTeXN0b2xpYyksCiAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgoU3lzdG9saWMpLAogICAgICAgICAgICAgICAgICAgZmlyc3RfcXVhbnRpbGUgPSBxdWFudGlsZShTeXN0b2xpYywgMC4yNSksCiAgICAgICAgICAgICAgICAgICB0aGlyZF9xdWFudGlsZSA9IHF1YW50aWxlKFN5c3RvbGljLCAwLjc1KSkgJT4lCiAgbXV0YXRlKGxvd2VyX2ZlbmNlID0gZmlyc3RfcXVhbnRpbGUgLSBpcXIqMiwKICAgICAgICAgdXBwZXJfZmVuY2UgPSB0aGlyZF9xdWFudGlsZSArIGlxcioyKSAlPiUKICBkaXN0aW5jdChgU3BlY2ltZW4gTmFtZWAsIERhdGUsIGxvd2VyX2ZlbmNlLCB1cHBlcl9mZW5jZSkKCgptYXJrX291dGxpZXJzX2RmIDwtIGJhZF9kYXlzX3JlbW92ZWRfZGYgJT4lCiAgZ3JvdXBfYnkoYFNwZWNpbWVuIE5hbWVgLCBgRGF0ZWApICU+JQogIGxlZnRfam9pbihmZW5jZXNfZGYsIGJ5ID0gYygiU3BlY2ltZW4gTmFtZSIsICJEYXRlIikpICU+JQogIG11dGF0ZShpcy5vdXRsaWVyID0gU3lzdG9saWMgPiB1cHBlcl9mZW5jZSB8IFN5c3RvbGljIDwgbG93ZXJfZmVuY2UpICU+JQogIGRwbHlyOjpzZWxlY3QoaXMub3V0bGllciwgZXZlcnl0aGluZygpKQoKY291bnRfb3V0bGllcnMgPC0gbWFya19vdXRsaWVyc19kZiAlPiUgCiAgZ3JvdXBfYnkoYFNwZWNpbWVuIE5hbWVgKSAlPiUKICBzdW1tYXJpemUoYCMgT3V0bGllcnNgID0gc3VtKGlzLm91dGxpZXIpKSAlPiUKICBmaWx0ZXIoYCMgT3V0bGllcnNgICE9IDApICU+JQogIGFycmFuZ2UoYFNwZWNpbWVuIE5hbWVgKQoKIyBrYWJsZShjb3VudF9vdXRsaWVycywgY2FwdGlvbiA9ICJTcGVjaW1lbnMgYnkgIyBvZiBvdXRsaWVycyIsIGFsaWduID0gImxjIikgJT4lCiMgICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIikgIAoKCiMgcmVtb3ZlIGFsbCByb3dzIHRoYXQgYXJlIG91dGxpZXJzCiMgc2V0IGZhY3RvciAKZmluYWxfZmlsdGVyZWRfZGF0YSA8LSBtYXJrX291dGxpZXJzX2RmICU+JQogIGZpbHRlcighaXMub3V0bGllcikgJT4lCiAgZ3JvdXBfYnkoYFNwZWNpbWVuIE5hbWVgLCBgRGF0ZWAsIFBoYXNlLCBjb2xvciwgZ3JvdXApICU+JQogIG11dGF0ZShQaGFzZSA9IGZhY3RvcihQaGFzZSwgbGV2ZWxzID0gZmN0X3BoYXNlcykpICU+JQogIGFycmFuZ2UoUGhhc2UpCgoKIycgQG5vdGUgYW5hbHlzaXMgb2Ygb3V0bGllciByZW1vdmFsCndpdGhfb3V0bGllcnNfZyA8LSBnZ3Bsb3QobWFya19vdXRsaWVyc19kZiwgYWVzKHggPSBgU3BlY2ltZW4gTmFtZWAsIHkgPSBTeXN0b2xpYywgY29sb3IgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJncm91cCIsIHZhbHVlcyA9IGxldmVscyhtYXJrX291dGxpZXJzX2RmJGNvbG9yKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG1hcmtfb3V0bGllcnNfZGYgJT4lIGZpbHRlcihpcy5vdXRsaWVyKSwgYWVzKHggPSBgU3BlY2ltZW4gTmFtZWAsIHkgPSBTeXN0b2xpYyksIGNvbG9yID0gIm1hZ2VudGEiLCBzaGFwZSA9IDE3LCBzaXplID0gMykgKyAKICBteV90aGVtZSArIAogIGdndGl0bGUoIk91dGxpZXJzIG1hcmtlZCIpICsgCiAgZmFjZXRfZ3JpZCh+IERhdGUpCgojIGp1c3QgcGxvdCB0aGUgd2F0ZXJtYXJrIG9mIHdoZXJlIHRoZSBvdXRsaWVycyB1c2VkIHRvIGJlLi4uCndpdGhvdXRfb3V0bGllcnNfZyA8LSBnZ3Bsb3QoZmluYWxfZmlsdGVyZWRfZGF0YSwgYWVzKHggPSBgU3BlY2ltZW4gTmFtZWAsIHkgPSBTeXN0b2xpYywgY29sb3IgPSBncm91cCkpICsgCiAgZ2VvbV9ib3hwbG90KCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJncm91cCIsIHZhbHVlcyA9IGxldmVscyhtYXJrX291dGxpZXJzX2RmJGNvbG9yKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG1hcmtfb3V0bGllcnNfZGYgJT4lIGZpbHRlcihpcy5vdXRsaWVyKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGBTcGVjaW1lbiBOYW1lYCwgeSA9IFN5c3RvbGljKSwgY29sb3IgPSAibWFnZW50YSIsIHNoYXBlID0gMTcsIHNpemUgPSAzLCBhbHBoYSA9IDAuMykgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDUwLDIyMCwyMCkpICsgCiAgbXlfdGhlbWUgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdD0xLCBzaXplID0gNyksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgZ2d0aXRsZSgiT3V0bGllcnMgcmVtb3ZlZCIpICsgCiAgZmFjZXRfd3JhcCh+IERhdGUsIG5jb2wgPSA1KQp3aXRob3V0X291dGxpZXJzX2cKCgpvdXRsaWVyX21pY2VfZGYgPC0gZmluYWxfZmlsdGVyZWRfZGF0YSAlPiUgCiAgZmlsdGVyKFBoYXNlICE9ICJ0cmFpbmluZyIpICU+JQogIGRwbHlyOjpzZWxlY3QoYFNwZWNpbWVuIE5hbWVgLCBEYXRlLCBgQ3ljbGUgI2AsIFN5c3RvbGljKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoYFNwZWNpbWVuIE5hbWVgLCBQaGFzZSkgJT4lICMgYWNyb3NzIGFsbCBkYXRlcwogIGRwbHlyOjpzdW1tYXJpemUoc2VtID0gc2QoU3lzdG9saWMpL3NxcnQobnVtX21pY2UpKQoKCmBgYAoKCgoKIyMgUGxvdCB0aGUgZGF0YSBvdmVyIHRpbWUgYW5kIHZpc3VhbGl6ZSB0aGUgdmFyaWFuY2UgcGVyIGRheSwgcGVyIHNhbXBsZSB3aXRoIGJveHBsb3RzLCBvdmVyIGFsbCBkYXlzCjwhLS0gIyMjIFRyaWFsIDMgLS0+CiAgPCEtLSAjIyMjIFN0YXJ0aW5nIDA0LzMwLzIxIC0gb3JhbCBnYXZhZ2Ugd2l0aCAyMDAgdUwgYW5kIHRhaWxjdWZmIHRyYWluaW5nIGJlZ2lucyAtLT4KICA8IS0tICMjIyMgMDUvNi8yMSAtIHZlaGljbGUgdHJlYXRtZW50ICgxMCUgRE1TTyAvIDQwJSBQRUcvIDUlIFR3ZWVuIC8gNDUlIFNhbGluZSkgYmVnaW5zIHRvIGVzdGFibGlzaCBiYXNlbGluZSBCUCAtLT4KICA8IS0tICMjIyMgNS8xMC8yMSAtIHJhbmRvbWl6ZWQgdG8gU09SQUZFTklCIHRyZWF0bWVudCBvciB2ZWhpY2xlICAtLT4KICAKICA8IS0tICMjIyMgU3RhcnRpbmcgMDQvMTUvMjEgLSBvcmFsIGdhdmFnZSB3aXRoIDIwMCB1TCBhbmQgdGFpbGN1ZmYgdHJhaW5pbmcgYmVnaW5zIC0tPgogIDwhLS0gIyMjIyAwNC8xOC8yMSAtIGJhc2VsaW5lIHJlY29yZGluZyBiZWZvcmUgdmVoaWNsZSB0cmVhdG1lbnQgLS0+CiAgPCEtLSAjIyMjIDA0LzIxLzIxIC0gdmVoaWNsZSB0cmVhdG1lbnQgKDEwJSBETVNPIC8gNDAlIFBFRy8gNSUgVHdlZW4gLyA0NSUgU2FsaW5lKSBiZWdpbnMgdG8gZXN0YWJsaXNoIGJhc2VsaW5lIEJQIC0tPgogIDwhLS0gIyMjIyAwNC8yNC8yMSAtIHJhbmRvbWl6ZWQgdG8gc3VuaXRpbmliICg4MCBtZy9rZy9kKSB0cmVhdG1lbnQgb3IgdmVoaWNsZSAgLS0+CiAgCiAgPCEtLSBUcmlhbCAyIC0tPgogIDwhLS0gIyMjIFN0YXJ0aW5nIDAzLzA1LzIxIC0gb3JhbCBnYXZhZ2UgYW5kIHRhaWxjdWZmIHRyYWluaW5nIGJlZ2lucyAtLT4KICA8IS0tICMjIyBTdGFydGluZyAwMy8wOC8yMSAtIGJhc2VsaW5lIHJlY29yZGluZyBiZWZvcmUgdmVoaWNsZSB0cmVhdG1lbnQgLS0+CiAgPCEtLSAjIyMgU3RhcnRpbmcgMDMvMTEvMjEgLSB2ZWhpY2xlIHRyZWF0bWVudCAoMTAlIFBFRy8gMC41JSBUd2VlbiAvfjkwJSBESSBIMk8gYXQgcEggfjMuNSkgYmVnaW5zIHRvIGVzdGFibGlzaCBiYXNlbGluZSBCUCAtLT4KICA8IS0tICMjIyBTdGFydGluZyAwMy8xNS8yMSAtIFJhbmRvbWl6ZWQgdG8gU3VuaXRpbmliICg0MCBtZy9rZy9kKSB0cmVhdG1lbnQgb3IgdmVoaWNsZSBiZWdpbnMgLS0+CiAgCmBgYHtyIGNhbGNfaW1wb3J0YW50X2RmcywgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIycgQE5vdGUgbWFpbiBkZiEgdGhpcyBpcyBzcGVjaW1lbiBhdmVyYWdlCnNwZWNpbWVuX2F2Z19kYXRhX2RmIDwtIGZpbmFsX2ZpbHRlcmVkX2RhdGEgJT4lIAogIHN1bW1hcml6ZShgc3BlY2ltZW5fbWVhbl9zeXN0b2xpY2AgPSBtZWFuKFN5c3RvbGljKSwgCiAgICAgICAgICAgIGBzcGVjaW1lbl9tZWRpYW5fc3lzdG9saWNgID0gbWVkaWFuKFN5c3RvbGljKSwKICAgICAgICAgICAgc3BlY2ltZW5fc2Rfc3lzdG9saWMgPSBzZChTeXN0b2xpYyksCiAgICAgICAgICAgIHNwZWNpbWVuX3NlbSA9IHNwZWNpbWVuX3NkX3N5c3RvbGljIC8gc3FydChudW1fbWljZSksIAogICAgICAgICAgICAuZ3JvdXBzID0gImtlZXAiKSAlPiUKICAjIG5lY2Vzc2FyeT8KICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKFBoYXNlID0gZmFjdG9yKFBoYXNlLCBsZXZlbHMgPSBmY3RfcGhhc2VzKSkKCmNhdChxcSgiXG4jIyBAe3RyaWFsX25hbWV9IHwgQHtkcnVnX25hbWV9IEB7ZHJ1Z19kb3NhZ2V9IG1nL2tnL2RcbiIpKQpjdXRvZmZfZGF0ZXNfZGYgPC0gc3BlY2ltZW5fYXZnX2RhdGFfZGYgJT4lCiAgZ3JvdXBfYnkoUGhhc2UpICU+JQogIHN1bW1hcml6ZShmaXJzdCA9IGZpcnN0KERhdGUpLCBsYXN0ID0gbGFzdChEYXRlKSkgJT4lCiAgbXV0YXRlX2FsbCguZnVucyA9IGFzLmNoYXJhY3RlcikgJT4lCiAgbXV0YXRlKGRhdGVfcmFuZ2UgPSBtYXAyX2NocihmaXJzdCwgbGFzdCwgZnVuY3Rpb24oZixsKXsKICAgIHJlcyA8LSBzdHJfYyhjKGYsIGwpLCBjb2xsYXBzZSA9ICIgdG8gIikKICAgIHJldHVybihyZXMpCiAgfSkpICU+JQogIG11dGF0ZShgTnVtYmVyIG9mIERheXNgID0gYXMuaW50ZWdlcihhcy5EYXRlKGxhc3QpIC0gYXMuRGF0ZShmaXJzdCkpICsgMSkgCgprYWJsZShjdXRvZmZfZGF0ZXNfZGYsIGNhcHRpb24gPSAiRGF0ZXMiLCBhbGlnbiA9ICJjIikgJT4lCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIpCgoKCmdyb3VwX3dpc2VfYnBfYW5kX3NlbSA8LSBzcGVjaW1lbl9hdmdfZGF0YV9kZiAlPiUKICBncm91cF9ieShgU3BlY2ltZW4gTmFtZWAsIGdyb3VwLCBQaGFzZSkgJT4lIAogIHN1bW1hcml6ZShzcGVjaW1lbl9ncnBfcGhhc2VfbWVhbl9zeXN0b2xpYyA9IG1lYW4oc3BlY2ltZW5fbWVhbl9zeXN0b2xpYyksCiAgICAgICAgICAgIHNwZWNpbWVuX2dycF9waGFzZV9zZF9zeXN0b2xpYyA9IHNkKHNwZWNpbWVuX21lYW5fc3lzdG9saWMpLAogICAgICAgICAgICBzcGVjaW1lbl9ncnBfcGhhc2Vfc2VtID0gc3BlY2ltZW5fZ3JwX3BoYXNlX3NkX3N5c3RvbGljIC8gc3FydChudW1fbWljZSkpIAoKcGhhc2Vfd2lzZV9icF9hbmRfc2VtIDwtIHNwZWNpbWVuX2F2Z19kYXRhX2RmICU+JQogIGdyb3VwX2J5KGdyb3VwLCBQaGFzZSkgJT4lIAogIHN1bW1hcml6ZShncnBfcGhhc2VfbWVhbl9zeXN0b2xpYyA9IG1lYW4oc3BlY2ltZW5fbWVhbl9zeXN0b2xpYyksCiAgICAgICAgICAgIGdycF9waGFzZV9zZF9zeXN0b2xpYyA9IHNkKHNwZWNpbWVuX21lYW5fc3lzdG9saWMpLAogICAgICAgICAgICBncnBfcGhhc2Vfc2VtID0gZ3JwX3BoYXNlX3NkX3N5c3RvbGljIC8gc3FydChudW1fbWljZSkpIAoKYGBgCgojIyBBc3Nlc3MgQlAgb2YgcmFuZG9tbHkgYXNzaWduZWQgZ3JvdXBzIGJlZm9yZSBnZXR0aW5nIHRyZWF0bWVudAoKYGBge3IgcGxvdF9ncm91cHdpc2V9CmdncGxvdChkYXRhID0gcGhhc2Vfd2lzZV9icF9hbmRfc2VtLCAKICAgICAgIGFlcyhmaWxsID0gYGdyb3VwYCwgeCA9IGdyb3VwLCB5ID0gZ3JwX3BoYXNlX21lYW5fc3lzdG9saWMpKSArCiAgCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjUpICsKICAjIHN0YXRfc3VtbWFyeShmdW4gPSJtZWFuIiwgY29sb3IgPSAiY3lhbiIsIHNob3cubGVnZW5kID0gRikgKwogIAogIGdlb21fcG9pbnQoZ3JvdXBfd2lzZV9icF9hbmRfc2VtLCAKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IGdyb3VwLCB5ID0gc3BlY2ltZW5fZ3JwX3BoYXNlX21lYW5fc3lzdG9saWMsIHNoYXBlID0gYFNwZWNpbWVuIE5hbWVgKSwgCiAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IFRSVUUsIGluaGVyaXQuYWVzID0gRkFMU0UpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IHNoYXBlX2lkcykgKwogIAogICMgdGV4dCBieSBncm91cCBhbmQgcGhhc2UKICBnZW9tX2xhYmVsKGRhdGEgPSBwaGFzZV93aXNlX2JwX2FuZF9zZW0sCiAgICAgICAgICAgICBhZXMoeCA9IGBncm91cGAsIHkgPSBtYXgoZ3JwX3BoYXNlX21lYW5fc3lzdG9saWMpICsgMzUsCiAgICAgICAgICAgICAgICAgbGFiZWwgPSByb3VuZChncnBfcGhhc2VfbWVhbl9zeXN0b2xpYywxKSksCiAgICAgICAgICAgICBoanVzdCA9IDAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMywKICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIHNob3cubGVnZW5kID0gRikgKwogIAogIGdlb21fZXJyb3JiYXIoZGF0YSA9IHBoYXNlX3dpc2VfYnBfYW5kX3NlbSwKICAgICAgICAgICAgICAgIGFlcyh4ID0gZ3JvdXAsIHltaW49YGdycF9waGFzZV9tZWFuX3N5c3RvbGljYC1ncnBfcGhhc2Vfc2VtLCAKICAgICAgICAgICAgICAgICAgICB5bWF4PWBncnBfcGhhc2VfbWVhbl9zeXN0b2xpY2ArZ3JwX3BoYXNlX3NlbSksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4wNSksIHNob3cubGVnZW5kID0gRiwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKwogICMgY2hhbmdlIGZpbGwgY29sb3JzCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJncm91cCIsIHZhbHVlcyA9IGxldmVscyhzcGVjaW1lbl9hdmdfZGF0YV9kZiRjb2xvcikpICsKICBteV90aGVtZSArCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSg5MCwgMjIwLCAxMCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdD0xKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICB5bGFiKCJBdmVyYWdlIFN5c3RvbGljIEJQIikgKwogIGdndGl0bGUoIkF2ZXJhZ2UgU3lzdG9saWMgQlAgYWNyb3NzIHBoYXNlcyIpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFBoYXNlKSwgc2NhbGVzID0gImZyZWVfeCIpIAoKYGBgCgoKIyMjIDMtZGF5IHJvbGxpbmcgYXZlcmFnZQojIyMjIyBUYWtlIHRoZSBsYXN0IDMtZGF5cyBvZiBhbiBpbnRlcnZhbCBhbmQgYXZlcmFnZSB0aGVtIGZvciBtb3JlIHJlYWxpc3RpYyBhdmVyYWdlcwpgYGB7ciB0aHJlZV9kYXl9Cgp0aHJlZV9kYXlfZGYgPC0gc3BlY2ltZW5fYXZnX2RhdGFfZGYgJT4lCiAgZ3JvdXBfYnkoYFNwZWNpbWVuIE5hbWVgLCBQaGFzZSkgJT4lCiAgbXV0YXRlKG4gPSBuKCk6MSkgJT4lCiAgZmlsdGVyKG4gJWluJSBjKDE6MykpCgp0aHJlZV9kYXlfZ3JvdXBfZGYgPC0gdGhyZWVfZGF5X2RmICU+JQogIGdyb3VwX2J5KGBTcGVjaW1lbiBOYW1lYCwgZ3JvdXAsIFBoYXNlKSAlPiUgCiAgc3VtbWFyaXplKHNwZWNpbWVuX2dycF9waGFzZV9tZWFuX3N5c3RvbGljID0gbWVhbihzcGVjaW1lbl9tZWFuX3N5c3RvbGljKSwKICAgICAgICAgICAgc3BlY2ltZW5fZ3JwX3BoYXNlX3NkX3N5c3RvbGljID0gc2Qoc3BlY2ltZW5fbWVhbl9zeXN0b2xpYyksCiAgICAgICAgICAgIHNwZWNpbWVuX2dycF9waGFzZV9zZW0gPSBzcGVjaW1lbl9ncnBfcGhhc2Vfc2Rfc3lzdG9saWMgLyBzcXJ0KG51bV9taWNlKSkgCgp0aHJlZV9kYXlfcGhhc2VfZGYgPC0gdGhyZWVfZGF5X2RmICU+JQogIGdyb3VwX2J5KGdyb3VwLCBQaGFzZSkgJT4lIAogIHN1bW1hcml6ZShncnBfcGhhc2VfbWVhbl9zeXN0b2xpYyA9IG1lYW4oc3BlY2ltZW5fbWVhbl9zeXN0b2xpYyksCiAgICAgICAgICAgIGdycF9waGFzZV9zZF9zeXN0b2xpYyA9IHNkKHNwZWNpbWVuX21lYW5fc3lzdG9saWMpLAogICAgICAgICAgICBncnBfcGhhc2Vfc2VtID0gZ3JwX3BoYXNlX3NkX3N5c3RvbGljIC8gc3FydChudW1fbWljZSkpIAoKZ2dwbG90KGRhdGEgPSB0aHJlZV9kYXlfcGhhc2VfZGYsIAogICAgICAgYWVzKGZpbGwgPSBgZ3JvdXBgLCB4ID0gZ3JvdXAsIHkgPSBncnBfcGhhc2VfbWVhbl9zeXN0b2xpYykpICsKICAKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuNSkgKwogICMgc3RhdF9zdW1tYXJ5KGZ1biA9Im1lYW4iLCBjb2xvciA9ICJjeWFuIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgCiAgZ2VvbV9wb2ludCh0aHJlZV9kYXlfZ3JvdXBfZGYsIAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gZ3JvdXAsIHkgPSBzcGVjaW1lbl9ncnBfcGhhc2VfbWVhbl9zeXN0b2xpYywgc2hhcGUgPSBgU3BlY2ltZW4gTmFtZWApLCAKICAgICAgICAgICAgIHNob3cubGVnZW5kID0gVFJVRSwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKyAKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfaWRzKSArCiAgCiAgIyB0ZXh0IGJ5IGdyb3VwIGFuZCBwaGFzZQogIGdlb21fbGFiZWwoZGF0YSA9IHRocmVlX2RheV9waGFzZV9kZiwKICAgICAgICAgICAgIGFlcyh4ID0gYGdyb3VwYCwgeSA9IG1heChncnBfcGhhc2VfbWVhbl9zeXN0b2xpYykgKyAzNSwKICAgICAgICAgICAgICAgICBsYWJlbCA9IHJvdW5kKGdycF9waGFzZV9tZWFuX3N5c3RvbGljLDEpKSwKICAgICAgICAgICAgIGhqdXN0ID0gMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAzLAogICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gdGhyZWVfZGF5X3BoYXNlX2RmLAogICAgICAgICAgICAgICAgYWVzKHggPSBncm91cCwgeW1pbj1gZ3JwX3BoYXNlX21lYW5fc3lzdG9saWNgLWdycF9waGFzZV9zZW0sIAogICAgICAgICAgICAgICAgICAgIHltYXg9YGdycF9waGFzZV9tZWFuX3N5c3RvbGljYCtncnBfcGhhc2Vfc2VtKSwgd2lkdGg9LjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSwgc2hvdy5sZWdlbmQgPSBGLCBpbmhlcml0LmFlcyA9IEZBTFNFKSArCiAgIyBjaGFuZ2UgZmlsbCBjb2xvcnMKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gImdyb3VwIiwgdmFsdWVzID0gbGV2ZWxzKHRocmVlX2RheV9kZiRjb2xvcikpICsKICBteV90aGVtZSArCiAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoNDAsIDE3NSwgMTApKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3Q9MSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgeWxhYigiQXZlcmFnZSBTeXN0b2xpYyBCUCIpICsKICBnZ3RpdGxlKCJMYXN0LW1vc3QgMy1kYXkgYXZlcmFnZXMgU0JQIGFjcm9zcyBQaGFzZXMiKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhQaGFzZSksIHNjYWxlcyA9ICJmcmVlX3giKSAKCmBgYAoKCiMjIyBUaW1lLXNlcmllcyBkYXRhCkZvciBjb21wbGV0ZW5lc3MsIGhlcmUgaXMgdGhlIHRpbWUgc2VyaWVzIGRhdGEgb2YgZWFjaCBtb3VzZSBhY3Jvc3MgZWFjaCBQaGFzZSBvZiB0aGUgZXhwZXJpbWVudDoKYGBge3IgdGltZSwgZmlnLndpZHRoPTE1LCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTh9CnBsb3RfdGltZV9zZXJpZXNfZGF0ZXNfYWRkIDwtIHNwZWNpbWVuX2F2Z19kYXRhX2RmICU+JQogIGdyb3VwX2J5KFBoYXNlKSAlPiUKICBhcnJhbmdlKFBoYXNlLCBEYXRlKSAlPiUgIyBjcml0aWNhbCB0byBzb3J0IGJlY2F1c2Ugd2UgdXNlIGZpcnN0IGFuZCBsYXN0IG5leHQKICBzdW1tYXJpemUoc3RhcnQgPSBhcy5EYXRlKGZpcnN0KERhdGUpKSwgZW5kID0gYXMuRGF0ZShsYXN0KERhdGUpKSArIDEpICU+JSAgIyBqdXN0IGFkZCAxIGRheSEKICBtdXRhdGUoZGF0ZV9yYW5nZSA9IG1hcDJfY2hyKHN0YXJ0LCBlbmQsIGZ1bmN0aW9uKGYsbCl7CiAgICByZXMgPC0gc3RyX2MoYyhhcy5jaGFyYWN0ZXIoZiksIGFzLmNoYXJhY3RlcihsKSksIGNvbGxhcHNlID0gIiB0byAiKQogICAgcmV0dXJuKHJlcykKICB9KSkgJT4lCiAgbXV0YXRlKG1pZF9zID0gKHN0YXJ0IC0gZW5kKS8yLAogICAgICAgICBtaWQgPSBlbmQgKyBtaWRfcykKCnBsb3RfdGltZV9zZXJpZXNfZGYgPC0gc3BlY2ltZW5fYXZnX2RhdGFfZGYgJT4lCiAgbGVmdF9qb2luKHBsb3RfdGltZV9zZXJpZXNfZGF0ZXNfYWRkKSAlPiUKICBsZWZ0X2pvaW4obWV0YV9kZl93X2Fzc2lnbiAlPiUgZHBseXI6OnNlbGVjdChgU3BlY2ltZW4gTmFtZWAsIGBNYWNoaW5lIElEYCkpICU+JQogIG11dGF0ZShgTWFjaGluZSBJRGAgPSBmYWN0b3IoYE1hY2hpbmUgSURgKSkKCgpnZ3Bsb3QocGxvdF90aW1lX3Nlcmllc19kZiwKICAgICAgIGFlcyh4ID0gYERhdGVgLAogICAgICAgICAgIHkgPSBzcGVjaW1lbl9tZWFuX3N5c3RvbGljLCBjb2xvciA9IGBncm91cGAsIHNoYXBlID0gYFNwZWNpbWVuIE5hbWVgKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9pZHMpICsKICBnZW9tX3BvaW50KHNpemUgPSA4KSArCiAgZ2VvbV9saW5lKCkgKyAKICAjIGdlb21fbGluZShzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgIyAgIGdlb21fc21vb3RoKGFlcyhsaW5ldHlwZSA9IGBTcGVjaW1lbiBOYW1lYCksIG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4gc3BsaW5lczo6YnMoeCwgNSksCiAgIyAgICAgICAgICAgICBzaXplID0gMywgc2UgPSBGQUxTRSkgKwogIGdlb21fc21vb3RoKGFlcyh4ID0gYERhdGVgLCB5ID0gc3BlY2ltZW5fbWVhbl9zeXN0b2xpYywgZ3JvdXAgPSBncm91cCwgY29sb3IgPSBncm91cCksCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBzcGxpbmVzOjpicyh4LCA0KSwKICAgICAgICAgICAgICBzaXplID0gMywgc2UgPSBGQUxTRSwgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKwogIAogIGdlb21fcmVjdChkYXRhID0gcGxvdF90aW1lX3Nlcmllc19kYXRlc19hZGQsIGluaGVyaXQuYWVzID0gRiwKICAgICAgICAgICAgYWVzKHhtaW4gPSBhcy5EYXRlKHN0YXJ0KSwgeG1heCA9IGFzLkRhdGUoZW5kKSwgeW1pbiA9IC1JbmYsIHltYXggPSBJbmYsIGZpbGwgPSBQaGFzZSksCiAgICAgICAgICAgIGFscGhhID0gMC4zLCBzaG93LmxlZ2VuZCA9IEYpICsKICAKICBnZW9tX2xhYmVsKGRhdGEgPSBwbG90X3RpbWVfc2VyaWVzX2RhdGVzX2FkZCwKICAgICAgICAgICAgIGFlcyh4ID0gbWlkLCB5ID0gbWluKHBsb3RfdGltZV9zZXJpZXNfZGYkc3BlY2ltZW5fbWVhbl9zeXN0b2xpYyksCiAgICAgICAgICAgICAgICAgbGFiZWwgPSBQaGFzZSksIGluaGVyaXQuYWVzID0gRkFMU0UsIHNob3cubGVnZW5kID0gRkFMU0UsIHNpemUgPSA2KSArCiAgCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IHN0YXJ0KSwKICAgICAgICAgICAgIGRhdGEgPSBwbG90X3RpbWVfc2VyaWVzX2RhdGVzX2FkZCwKICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NTAiLCBhbHBoYSA9IDAuNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBzcGVjaW1lbl9tZWFuX3N5c3RvbGljIC0gc3BlY2ltZW5fc2VtLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBzcGVjaW1lbl9tZWFuX3N5c3RvbGljICsgc3BlY2ltZW5fc2VtKSwgd2lkdGg9LjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIG15X3RoZW1lICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JheSIsICIjMWU4MWIwIiwgIiNlZDk5NDIiLCAiZGFya29yYW5nZTEiLCAicmVkIikpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiZ3JvdXAiLCB2YWx1ZXMgPSBsZXZlbHMoc3BlY2ltZW5fYXZnX2RhdGFfZGYkY29sb3IpKSArCiAgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoNDAsMjUwLDEwKSkgKwogIHNjYWxlX3hfZGF0ZShicmVha3M9dW5pcXVlKHNwZWNpbWVuX2F2Z19kYXRhX2RmJERhdGUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3Q9MSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJUaW1lLXNlcmllcyBwbG90IG9mIEF2ZXJhZ2UgVGFpbC1jdWZmIFN5c3RvbGljIEJQIG1lYXN1cmVtZW50cyIpICsKICB5bGFiKCJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykiKQoKCiMgY3Vtc3VtX3Bsb3RfdGltZV9zZXJpZXNfZGYgPC0gcGxvdF90aW1lX3Nlcmllc19kZiAlPiUKIyAgIGdyb3VwX2J5KGBTcGVjaW1lbiBOYW1lYCwgUGhhc2UsIGNvbG9yKSAlPiUgCiMgICBzdW1tYXJpemUodHN1bSA9IGN1bXN1bShzcGVjaW1lbl9tZWFuX3N5c3RvbGljKSkgJT4lCiMgICBiaW5kX2NvbHMocGxvdF90aW1lX3Nlcmllc19kZiAlPiUgCiMgICAgICAgICAgICAgICBzZWxlY3QoLWMoYFNwZWNpbWVuIE5hbWVgLCBQaGFzZSwgY29sb3IpKSkKIyAKIyAKIyBnZ3Bsb3QoY3Vtc3VtX3Bsb3RfdGltZV9zZXJpZXNfZGYsIGFlcyh4ID0gRGF0ZSwgeSA9IHRzdW0sIGNvbG9yID0gZ3JvdXApKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3IgYXZnX3RpbWVfc2VyaWVzfQp0aW1lX3Nlcmllc19hdmdfYnlfZ3JvdXBfcGhhc2UgPC0gc3BlY2ltZW5fYXZnX2RhdGFfZGYgJT4lCiAgZ3JvdXBfYnkoZ3JvdXAsIFBoYXNlLCBEYXRlKSAlPiUKICBzdW1tYXJpemUoZ3JvdXBfcGhhc2VfYXZnX3N5c3RvbGljID0gbWVhbihzcGVjaW1lbl9tZWFuX3N5c3RvbGljKSwKICAgICAgICAgICAgZ3JvdXBfcGhhc2Vfc2VtID0gc2Qoc3BlY2ltZW5fbWVhbl9zeXN0b2xpYykvc3FydChudW1fbWljZSkpCgpnZ3Bsb3QodGltZV9zZXJpZXNfYXZnX2J5X2dyb3VwX3BoYXNlLAogICAgICAgYWVzKHggPSBgRGF0ZWAsCiAgICAgICAgICAgeSA9IGdyb3VwX3BoYXNlX2F2Z19zeXN0b2xpYywgY29sb3IgPSBgZ3JvdXBgKSkgKwogIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBGKSArCiAgZ2VvbV9saW5lKCkrCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGdyb3VwLCBjb2xvciA9IGdyb3VwKSwgc3RhdD0ic21vb3RoIiwgbWV0aG9kID0gImxtIiwKICAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAgICAgICAgICAgbGluZXR5cGUgPSJkYXNoZWQiLAogICAgICAgICAgICBhbHBoYSA9IDAuNykgKwogICMgc2NhbGVfY29sb3JfamNvKCkgKwogIG15X3RoZW1lICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gZ3JvdXBfcGhhc2VfYXZnX3N5c3RvbGljIC0gZ3JvdXBfcGhhc2Vfc2VtLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBncm91cF9waGFzZV9hdmdfc3lzdG9saWMgKyBncm91cF9waGFzZV9zZW0pLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSsKICAjIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDcwLDIyMCwxMCkpICsKICBzY2FsZV94X2RhdGUoYnJlYWtzPXVuaXF1ZShzcGVjaW1lbl9hdmdfZGF0YV9kZiREYXRlKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0PTEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiVGltZS1zZXJpZXMgcGxvdCBvZiBBdmVyYWdlIFRhaWwtY3VmZiBTeXN0b2xpYyBCUCBtZWFzdXJlbWVudHMiKSArCiAgeWxhYigiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gImdyb3VwIiwgdmFsdWVzID0gbGV2ZWxzKHNwZWNpbWVuX2F2Z19kYXRhX2RmJGNvbG9yKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoUGhhc2UpLCAgc2NhbGVzID0gImZyZWVfeCIpCmBgYAoKIyBUaW1lLXNlcmllcyBkaWZmIGJ5IGluZGl2aWR1YWwgbW91c2UgZnJvbSB2ZWhpY2xlIGF2ZXJhZ2UgdG8gZW5kIG9mIHRyZWF0bWVudApgYGB7ciB0aW1lX3Nlcmllc19kaWZmfQp0aW1lX3Nlcmllc19hdmdfZGlmZl9ieV9tb3VzZV90ZW1wMSA8LSBzcGVjaW1lbl9hdmdfZGF0YV9kZiAlPiUKICBmaWx0ZXIoIShQaGFzZSAlaW4lIGMoInRyYWluaW5nIiwgInZlaGljbGUiKSkpICU+JQogIG11dGF0ZShEYXRlID0gYXMuZmFjdG9yKERhdGUpKQoKdmVoaWNsZV9hdmdfM2RheSA8LSBzcGVjaW1lbl9hdmdfZGF0YV9kZiAlPiUKICBmaWx0ZXIoUGhhc2UgPT0gInZlaGljbGUiKSAlPiUKICBncm91cF9ieShgU3BlY2ltZW4gTmFtZWAsIGdyb3VwLCBjb2xvciwgUGhhc2UpICU+JQogIHN1bW1hcml6ZShzcGVjaW1lbl9tZWFuX3N5c3RvbGljID0gbWVhbihzcGVjaW1lbl9tZWFuX3N5c3RvbGljKSwKICAgICAgICAgICAgc3BlY2ltZW5fc2VtX3N5c3RvbGljICA9IHNkKHNwZWNpbWVuX21lYW5fc3lzdG9saWMpL3NxcnQobnVtX21pY2UpKSAlPiUKICBtdXRhdGUoRGF0ZSA9IGFzLmZhY3RvcihjdXRvZmZfZGF0ZXNfZGYgJT4lIGZpbHRlcihQaGFzZSA9PSAidmVoaWNsZSIpICU+JSBwbHVjaygiZGF0ZV9yYW5nZSIpKSkKCm5ld19sZXZlbHMgPC0gYyhsZXZlbHModmVoaWNsZV9hdmdfM2RheSREYXRlWzFdKSwgbGV2ZWxzKHRpbWVfc2VyaWVzX2F2Z19kaWZmX2J5X21vdXNlX3RlbXAxJERhdGUpKQoKdGltZV9zZXJpZXNfYXZnX2RpZmZfYnlfbW91c2UgPC0gYmluZF9yb3dzKHZlaGljbGVfYXZnXzNkYXksIHRpbWVfc2VyaWVzX2F2Z19kaWZmX2J5X21vdXNlX3RlbXAxKSAlPiUKICBtdXRhdGUoRGF0ZSA9IGZhY3RvcihEYXRlLCBsZXZlbHMgPSBuZXdfbGV2ZWxzKSkgJT4lCiAgZ3JvdXBfYnkoYFNwZWNpbWVuIE5hbWVgKSAlPiUKICBtdXRhdGUodGltZV9zZXJpZXNfYXZnX2RpZmZfcGVyX21vdXNlID0gc3BlY2ltZW5fbWVhbl9zeXN0b2xpYyAtIHNwZWNpbWVuX21lYW5fc3lzdG9saWNbMUxdLAogICAgICAgICB0aW1lX3Nlcmllc19zZW1fZGlmZl9wZXJfbW91c2UgPSBzcGVjaW1lbl9zZW0gLSBzcGVjaW1lbl9zZW1bMUxdKSAlPiUKICBhcnJhbmdlKFBoYXNlKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1jKHNwZWNpbWVuX21lYW5fc3lzdG9saWMsIAogICAgICAgICAgICAgICAgICAgc3BlY2ltZW5fc2VtX3N5c3RvbGljLCBzcGVjaW1lbl9tZWRpYW5fc3lzdG9saWMsIAogICAgICAgICAgICAgICAgICAgc3BlY2ltZW5fc2Rfc3lzdG9saWMsIHNwZWNpbWVuX3NlbSkpCgoKZ2dwbG90KHRpbWVfc2VyaWVzX2F2Z19kaWZmX2J5X21vdXNlLAogICAgICAgYWVzKHggPSBgRGF0ZWAsCiAgICAgICAgICAgeSA9IHRpbWVfc2VyaWVzX2F2Z19kaWZmX3Blcl9tb3VzZSwgZ3JvdXAgPSBgU3BlY2ltZW4gTmFtZWAsIHNoYXBlID0gYFNwZWNpbWVuIE5hbWVgLCBjb2xvciA9IGBncm91cGApKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IFQpICsKICBnZW9tX2xpbmUoKSsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBncm91cCwgY29sb3IgPSBncm91cCksIHN0YXQ9InNtb290aCIsIG1ldGhvZCA9ICJsbSIsCiAgIyAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAjICAgICAgICAgICBsaW5ldHlwZSA9ImRhc2hlZCIsCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLjcpICsKICAjIHNjYWxlX2NvbG9yX2pjbygpICsKICBteV90aGVtZSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHRpbWVfc2VyaWVzX2F2Z19kaWZmX3Blcl9tb3VzZSAtIHRpbWVfc2VyaWVzX3NlbV9kaWZmX3Blcl9tb3VzZSwKICAgICAgICAgICAgICAgICAgICB5bWF4ID0gdGltZV9zZXJpZXNfYXZnX2RpZmZfcGVyX21vdXNlICsgdGltZV9zZXJpZXNfc2VtX2RpZmZfcGVyX21vdXNlKSwgd2lkdGg9LjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoLTUwLDE1MCwxMCkpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gc2hhcGVfaWRzKSArCiAgIyBzY2FsZV94X2RhdGUoYnJlYWtzPXVuaXF1ZShzcGVjaW1lbl9hdmdfZGF0YV9kZiREYXRlKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0PTEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiKkRpZmZlcmVuY2UqIHBlciBtb3VzZSBmcm9tIHZlaGljbGUgYmFzZWxpbmVcblRhaWwtY3VmZiBTeXN0b2xpYyBCUCBtZWFzdXJlbWVudHMiKSArCiAgeWxhYigiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gImdyb3VwIiwgdmFsdWVzID0gbGV2ZWxzKHNwZWNpbWVuX2F2Z19kYXRhX2RmJGNvbG9yKSkgCgoKZ2dwbG90KHRpbWVfc2VyaWVzX2F2Z19kaWZmX2J5X21vdXNlICU+JSBmaWx0ZXIoRGF0ZSAlaW4lIGMobGV2ZWxzKHZlaGljbGVfYXZnXzNkYXkkRGF0ZVsxXSksIGN1dG9mZl9kYXRlc19kZiRsYXN0KSksCiAgICAgICBhZXMoeCA9IGBEYXRlYCwKICAgICAgICAgICB5ID0gdGltZV9zZXJpZXNfYXZnX2RpZmZfcGVyX21vdXNlLCBncm91cCA9IGBTcGVjaW1lbiBOYW1lYCwgc2hhcGUgPSBgU3BlY2ltZW4gTmFtZWAsIGNvbG9yID0gYGdyb3VwYCkpICsKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gVCkgKwogIGdlb21fbGluZSgpKwogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGdyb3VwLCBjb2xvciA9IGdyb3VwKSwgc3RhdD0ic21vb3RoIiwgbWV0aG9kID0gImxtIiwKICAjICAgICAgICAgICBzaXplID0gMS41LAogICMgICAgICAgICAgIGxpbmV0eXBlID0iZGFzaGVkIiwKICAjICAgICAgICAgICBhbHBoYSA9IDAuNykgKwogICMgc2NhbGVfY29sb3JfamNvKCkgKwogIG15X3RoZW1lICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gdGltZV9zZXJpZXNfYXZnX2RpZmZfcGVyX21vdXNlIC0gdGltZV9zZXJpZXNfc2VtX2RpZmZfcGVyX21vdXNlLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB0aW1lX3Nlcmllc19hdmdfZGlmZl9wZXJfbW91c2UgKyB0aW1lX3Nlcmllc19zZW1fZGlmZl9wZXJfbW91c2UpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgtNTAsMTUwLDEwKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBzaGFwZV9pZHMpICsKICAjIHNjYWxlX3hfZGF0ZShicmVha3M9dW5pcXVlKHNwZWNpbWVuX2F2Z19kYXRhX2RmJERhdGUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3Q9MSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICIqRGlmZmVyZW5jZSogcGVyIG1vdXNlIGZyb20gdmVoaWNsZSBiYXNlbGluZVxuVGFpbC1jdWZmIFN5c3RvbGljIEJQIG1lYXN1cmVtZW50cyIpICsKICB5bGFiKCJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiZ3JvdXAiLCB2YWx1ZXMgPSBsZXZlbHMoc3BlY2ltZW5fYXZnX2RhdGFfZGYkY29sb3IpKSAKCgoKCnRpbWVfc2VyaWVzX2F2Z19kaWZmIDwtIHRpbWVfc2VyaWVzX2F2Z19kaWZmX2J5X21vdXNlICU+JQogIGdyb3VwX2J5KGdyb3VwLCBjb2xvciwgRGF0ZSkgJT4lCiAgc3VtbWFyaXplKHRpbWVfc2VyaWVzX2F2Z19kaWZmID0gbWVhbih0aW1lX3Nlcmllc19hdmdfZGlmZl9wZXJfbW91c2UpLAogICAgICAgICAgICB0aW1lX3Nlcmllc19zZW1fZGlmZiA9IHNkKHRpbWVfc2VyaWVzX3NlbV9kaWZmX3Blcl9tb3VzZSkvc3FydChudW1fbWljZSkpCgpnZ3Bsb3QodGltZV9zZXJpZXNfYXZnX2RpZmYsCiAgICAgICBhZXMoeCA9IGBEYXRlYCwKICAgICAgICAgICB5ID0gdGltZV9zZXJpZXNfYXZnX2RpZmYsIGdyb3VwID0gYGdyb3VwYCwgY29sb3IgPSBgZ3JvdXBgKSkgKwogIGdlb21fcG9pbnQoc2hvdy5sZWdlbmQgPSBUKSArCiAgZ2VvbV9saW5lKCkrCiAgIyBnZW9tX2xpbmUoYWVzKGdyb3VwID0gZ3JvdXAsIGNvbG9yID0gZ3JvdXApLCBzdGF0PSJzbW9vdGgiLCBtZXRob2QgPSAibG0iLAogICMgICAgICAgICAgIHNpemUgPSAxLjUsCiAgIyAgICAgICAgICAgbGluZXR5cGUgPSJkYXNoZWQiLAogICMgICAgICAgICAgIGFscGhhID0gMC43KSArCiAgIyBzY2FsZV9jb2xvcl9qY28oKSArCiAgbXlfdGhlbWUgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSB0aW1lX3Nlcmllc19hdmdfZGlmZiAtIHRpbWVfc2VyaWVzX3NlbV9kaWZmLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB0aW1lX3Nlcmllc19hdmdfZGlmZiArIHRpbWVfc2VyaWVzX3NlbV9kaWZmKSwgd2lkdGg9LjIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjA1KSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoLTUwLDE1MCwxMCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdD0xKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKHRpdGxlID0gIipEaWZmZXJlbmNlKiBhdmVyYWdlZCBvdmVyIGdyb3VwcyBmcm9tIHZlaGljbGUgYmFzZWxpbmVcblRhaWwtY3VmZiBTeXN0b2xpYyBCUCBtZWFzdXJlbWVudHMiKSArCiAgeWxhYigiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gImdyb3VwIiwgdmFsdWVzID0gbGV2ZWxzKHNwZWNpbWVuX2F2Z19kYXRhX2RmJGNvbG9yKSkgCgoKCnRpbWVfc2VyaWVzX2F2Z19kaWZmIDwtIHRpbWVfc2VyaWVzX2F2Z19kaWZmX2J5X21vdXNlICU+JQogIGdyb3VwX2J5KGdyb3VwLCBjb2xvciwgRGF0ZSkgJT4lCiAgc3VtbWFyaXplKHRpbWVfc2VyaWVzX2F2Z19kaWZmID0gbWVhbih0aW1lX3Nlcmllc19hdmdfZGlmZl9wZXJfbW91c2UpLAogICAgICAgICAgICB0aW1lX3Nlcmllc19zZW1fZGlmZiA9IHNkKHRpbWVfc2VyaWVzX3NlbV9kaWZmX3Blcl9tb3VzZSkvc3FydChudW1fbWljZSkpCgpnZ3Bsb3QodGltZV9zZXJpZXNfYXZnX2RpZmYgJT4lIGZpbHRlcihEYXRlICVpbiUgYyhsZXZlbHModmVoaWNsZV9hdmdfM2RheSREYXRlWzFdKSwgY3V0b2ZmX2RhdGVzX2RmJGxhc3QpKSwKICAgICAgIGFlcyh4ID0gYERhdGVgLAogICAgICAgICAgIHkgPSB0aW1lX3Nlcmllc19hdmdfZGlmZiwgZ3JvdXAgPSBgZ3JvdXBgLCBjb2xvciA9IGBncm91cGApKSArCiAgZ2VvbV9wb2ludChzaG93LmxlZ2VuZCA9IFQpICsKICBnZW9tX2xpbmUoKSsKICAjIGdlb21fbGluZShhZXMoZ3JvdXAgPSBncm91cCwgY29sb3IgPSBncm91cCksIHN0YXQ9InNtb290aCIsIG1ldGhvZCA9ICJsbSIsCiAgIyAgICAgICAgICAgc2l6ZSA9IDEuNSwKICAjICAgICAgICAgICBsaW5ldHlwZSA9ImRhc2hlZCIsCiAgIyAgICAgICAgICAgYWxwaGEgPSAwLjcpICsKICAjIHNjYWxlX2NvbG9yX2pjbygpICsKICBteV90aGVtZSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IHRpbWVfc2VyaWVzX2F2Z19kaWZmIC0gdGltZV9zZXJpZXNfc2VtX2RpZmYsCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IHRpbWVfc2VyaWVzX2F2Z19kaWZmICsgdGltZV9zZXJpZXNfc2VtX2RpZmYpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMDUpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgtNTAsMTUwLDEwKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0PTEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiKkRpZmZlcmVuY2UqIGF2ZXJhZ2VkIG92ZXIgZ3JvdXBzIGZyb20gdmVoaWNsZSBiYXNlbGluZVxuVGFpbC1jdWZmIFN5c3RvbGljIEJQIG1lYXN1cmVtZW50cyIpICsKICB5bGFiKCJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSAobW1IZykiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiZ3JvdXAiLCB2YWx1ZXMgPSBsZXZlbHMoc3BlY2ltZW5fYXZnX2RhdGFfZGYkY29sb3IpKSAKYGBgCgojIFRpbWUtc2VyaWVzIGRpZmYgYnkgZ3JvdXAKCjwhLS0gIyMjIFRyZWF0bWVudCB3aXRoIFN1bml0aW5pYiBzdGFydCBvbiAwMy8xNS8yMSBCUCAocmVjb3JkaW5nIG9mIGVmZmVjdCBzdGFydHMgb24gMDMvMTYvMjEpIC0tPgogIDwhLS0gU2luY2UgQlAgaXMgcmVjb3JkZWQgYmVmb3JlIGdhdmFnZSB0byByZWR1Y2Ugc3RyZXNzIC0tPgpUaGVzZSBhcmUgdGhlIGF2ZXJhZ2UgYmxvb2QgcHJlc3N1cmVzIG9mIGVhY2ggbWljZSBhY3Jvc3MgZWFjaCBQaGFzZSBvZiB0aGUgZXhwZXJpbWVudAoKYGBge3IgdHJlYXRtZW50LCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTE4fQoKIyBjdXRvZmYgZGF0ZXMgY2FsY3VsYXRlZCBlYXJseSBvbgpuYW1lc19jaHIgPC0gY3V0b2ZmX2RhdGVzX2RmICU+JSBwbHVjaygiUGhhc2UiKQpyYW5nZXNfY2hyIDwtIGN1dG9mZl9kYXRlc19kZiAlPiUgcGx1Y2soImRhdGVfcmFuZ2UiKQpmb3JtYXR0ZWRfcmFuZ2VzIDwtIHN0cl9jKG5hbWVzX2NociwgcmFuZ2VzX2Nociwgc2VwID0gIjogIiwgY29sbGFwc2UgPSAiXG4iKQoKIyBzZWUgbG90cyBvZiBkb3RzIGJlY2F1c2Ugb3V0bGllcnMgYXJlIHJlbW92ZWQgcGVyIERBWSBub3QgYXMgYSBmdW5jdGlvbiBvZiBhbGwgb2YgdGhlIGRhdGEgYWNyb3NzIGRheXMKIyBzaG91bGQgdGhpcyBjaGFuZ2U/CmdncGxvdChmaW5hbF9maWx0ZXJlZF9kYXRhLCBhZXMoeCA9IGBTcGVjaW1lbiBOYW1lYCwgeSA9IGBTeXN0b2xpY2AsIGdyb3VwID0gYFNwZWNpbWVuIE5hbWVgLCBmaWxsID0gYGdyb3VwYCkpICsKICBnZW9tX2JveHBsb3QocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYT0wLjgpICsKICBzdGF0X3N1bW1hcnkoZnVuLnk9Im1lYW4iLCBjb2xvciA9ICJjeWFuIiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoNzAsMjUwLDEwKSkgKwogICMgc2NhbGVfZmlsbF9qY28oKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJncm91cCIsIHZhbHVlcyA9IGxldmVscyhmaW5hbF9maWx0ZXJlZF9kYXRhJGNvbG9yKSkgKwogIGxhYnModGl0bGUgPSAiQm94cGxvdHMgb2YgTWljZSBTeXN0b2xpYyBCUCBieSBUYWlsLWN1ZmYgYnkgUGhhc2UiLAogICAgICAgc3VidGl0bGUgPSBmb3JtYXR0ZWRfcmFuZ2VzKSArCiAgeWxhYigiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgKG1tSGcpIikgKwogIG15X3RoZW1lICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgZ2VvbV9sYWJlbChkYXRhID0gZ3JvdXBfd2lzZV9icF9hbmRfc2VtLAogICAgICAgICAgICAgYWVzKGxhYmVsID0gcm91bmQoc3BlY2ltZW5fZ3JwX3BoYXNlX21lYW5fc3lzdG9saWMsMSksCiAgICAgICAgICAgICAgICAgeCA9IGBTcGVjaW1lbiBOYW1lYCwgaGp1c3QgPSAwLjUsIHkgPSAyMDApLAogICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoUGhhc2UpKQoKYGBgCgojIEJvb2tsZXQgdXNhZ2UgaW5zdHJ1Y3Rpb25zCiMjIERvd25sb2FkIGV4Y2VsIGRhdGEgYWZ0ZXIgZmluaXNoaW5nIHRoZSBleHBlcmltZW50cyBvbnRvIHRodW1iIGRyaXZlCkNvcHkgdGhlIGRhdGEgaW50byBhICptYXN0ZXIqIGV4Y2VsIGZpbGUgd2l0aCB0d28gc2hlZXRzLCBtYWtpbmcgc3VyZSB0aGF0IHRoZXJlJ3Mgb25seSBvbmUgaGVhZGVyIChhdCB0aGUgdmVyeSB0b3Agb2YgdGhlIHBhZ2UpLgoKICAxLiBZb3UnbGwgbmVlZCB0byBhZGQgaW4gdHdvIGNvbHVtbnMgbWFudWFsbHkgdG8gdGhpcyBtYXN0ZXIgc2hlZXQ6ICpEYXRlKiBhbmQgKlBoYXNlKi4gUGhhc2UgY2FuIHRha2Ugb25lIG9mIDQgdmFsdWVzOiAidHJhaW5pbmciLCAiYmFzZWxpbmUiLCAidmVoaWNsZSIsICJ0cmVhdG1lbnQiLiBUcmFpbmluZyBkYXRhIHVsdGltYXRlbHkgZ2V0cyByZW1vdmVkLCBidXQgaW5jbHVkZWQgaW4gdGhlIGRhdGEgc2hlZXQgZm9yIGNvbXBsZXRlbmVzcy4gRmlyc3Qgc2hlZXQgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgpgYGB7ciBkYXRhX3NoYXBlLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgpoZWFkZXJfdG9fZWRpdCA8LSBjb2xuYW1lcyhkYXRhX3RlbXApWzZdCmthYmxlKGhlYWQoZGF0YV90ZW1wLCBuID0gNiksIGNhcHRpb24gPSAiTWV0YWRhdGEiLCBhbGlnbiA9ICJjIikgJT4lCiAgY29sdW1uX3NwZWMoY29sdW1uID0gYyhuY29sKGRhdGFfdGVtcCktMSwgbmNvbChkYXRhX3RlbXApKSwgYmFja2dyb3VuZCA9ICJncmVlbnllbGxvdyIpICU+JQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiKQoKYGBgCjIuIFNlY29uZCBzaGVldCBzaG91bGQgYmUgY3JlYXRlZCBtYW51YWxseSBiYXNlZCBvbiB5b3VyIG1pY2UuIEZpbGwgaW4gdGhlIHZhcmlvdXMgZmllbGRzLgpgYGB7ciBkYXRhX3NoYXBlMiwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprYWJsZShoZWFkKG1ldGFfZGZfYWxsICU+JSBhcnJhbmdlKGBEYXRlYCwgYFNwZWNpbWVuIE5hbWVgKSwgbiA9IDEwKSwgY2FwdGlvbiA9ICJNZXRhZGF0YSIsIGFsaWduID0gImMiKSAlPiUKICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIikKYGBgCgoKCg==